/***********************************nvs的命令行工具使用************************************************
nvs_get  <key> <type>
  Get key-value pair from selected namespace. 
Example: nvs_get VarName i32
         <key>  key of the value to be read
        <type>  type can be: i8, u8, i16, u16 i32, u32 i64, u64, str, blob

nvs_erase  <key>
  Erase key-value pair from current namespace
         <key>  key of the value to be erased

nvs_namespace  <namespace>
  Set current namespace
   <namespace>  namespace of the partition to be selected

nvs_list  <partition> [-n <namespace>] [-t <type>]
  List stored key-value pairs stored in NVS.Namespace and type can be specified
  to print only those key-value pairs.
  Following command list variables stored inside 'nvs' partition, under
  namespace 'storage' with type uint32_t Example: nvs_list nvs -n storage -t u32

   <partition>  partition name
  -n, --namespace=<namespace>  namespace name
  -t, --type=<type>  type can be: i8, u8, i16, u16 i32, u32 i64, u64, str, blob

nvs_erase_namespace  <namespace>
  Erases specified namespace
   <namespace>  namespace to be erased
NVS区的大小：   0x6000 24K的空间6个扇区，0x1000为一个扇区

//Flash写入大数据时 需要考虑一个扇区内，还要考虑对齐问题，跳了分区之后，需要擦除新的分区，
如果下个分区的数据还要，需要提前读出来，修改前半部分，擦除整个扇区，并写入。要做跳分区处理。

flash芯片的写操作只能将1变为0，而不能将0变为1，擦除之后，flash中是全1的状态，若想将0变为1则
只能通过擦除操作。所以严格来说不是不支持覆盖写，因为对于特定的数据（只要不涉及0变1）也可以进行覆盖写。

nvs 内部有擦写均衡, 有标志位记录当前有效存储. 如第一次擦除 sector, 再写 sector 0-63 Byte, 
第二次写 sector 64-127 Bytes, 第 64 次(4KB/64Bytes) 写完 sector 最后一个 64 Byte. 
对应: 1 次擦除 flash, 64 次写 flash这样 NVS 减少 64 倍擦除操作, 对 flash 寿命有较大提升。
在 NVS 分区更大, 存储信息少时, 表现的更为明显.
******************************************************************************************/
#ifndef __EC_PARAM_H_
#define __EC_PARAM_H_
#include "esp_log.h"
#include "esp_check.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "ec_config.h"

#define NVS_NAMESPACE		"NVS"
typedef enum
{
    NVS_READ = 0,          		//版本号
    NVS_WRITE,                  //仪表的SN号
}NVS_READ_WRITE_T;

/************************参数区****************************************************/
typedef enum
{
    UI_EVENT_UP_KEY_PRESSED = 0,
    UI_EVENT_DOWN_KEY_PRESSED,
    UI_EVENT_POWER_KEY_PRESSED,
    UI_EVENT_MODE_KEY_PRESSED,
    UI_EVENT_LIGHT_KEY_PRESSED,
}UI_EVENT_GROUP_T;//
typedef enum
{
  PARAM_VER = 0,          		    //版本号
  SN_NUM,                         //仪表的SN号
  CONFIG_PARAM,                   //配置参数
  VOLTAGE_INFO,                   //电量电压信息
  PASSWD_INFO,                    //密码信息
  RIDING_INFO,                    //骑行信息
  PAS_RIDING_INFO,                //各档位骑行信息
  CALI_INFO,                       //校准信息
  BLE_INFO,                        //蓝牙信息
  NVS_KEY_VALUE_MAX,              //NVS键值最大值
}NVS_KEY_VALUE_T;
/***********************信息区，一次性写入，不需要修改*******************************/
typedef enum
{
//TAG NVS分区--PARAM_VER--版本信息
    DIC_SYS_PARAM_VER = 0,          //仪表参数版本,1个字节
//TAG NVS分区--SN_NUM--序列号信息
    DIC_SYS_SN,                     //仪表序列号,32个字节
    DIC_SYS_SW_VER,                 //仪表软件版本号，4个字节
    DIC_SYS_HW_VER,                 //仪表硬件版本号，4字节
    DIC_SYS_PRO_SW_VER,             //仪表赛维软件协议版本号。3字节
//TAG NVS分区--CONFIG_PARAM--配置信息
    DIC_SYS_SPEED_LIMIT,            //限速,1个字节，1Km/h
    DIC_SYS_WHEEL_CODE,             //轮径，2个字节，0.1in
    DIC_SYS_WHEEL_SIZE,             //轮周长，2个字节，0.1cm
    DIC_SYS_AUTO_OFF_TIME,          //自动关机时间,1个字节，单位分钟,0立刻关机，127永不关机，其他：X分钟后关机
    DIC_SYS_BOOT_MODE,              //启动方式,1个字节，0：零启动，1：非零启动
    
    DIC_SYS_START_STRENGTH,         //缓启动方式，0~3：1-4档，1个字节

    DIC_SYS_POWERON_PAS_LEVEL,      //开机助力档位，1，1个字节
    DIC_SYS_ASSISTANT_DIR,          //助力方向，0：正向，1：反向，1个字节
    DIC_SYS_ASSISTANT_NUM,          //助力磁钢数，1个字节
    DIC_SYS_SPEED_SENSOR,           //测速磁钢数，1个字节
    
    DIC_SYS_PAS_SENSITIVITY,        //助力灵敏度，1个字节
    DIC_SYS_KEY_PUSH_EN,            //按键是否助推，1个字节
    DIC_SYS_HANDLE_PUSH_EN,         //转把是否助推，1个字节
    DIC_SYS_HANDLE_SEGEMENT_EN,     //转把分档，1个字节
    DIC_SYS_EXTI_TIME,              //1个字节，无操作退出设置界面时间，单位S，
    
    DIC_SYS_SENSITIVITY_LEVEL,      //光感灵敏度等级，1个字节，光感灵敏度等级0-5级，0xFF:OFF
    DIC_SYS_CURRENT_LIMIT,          //限流值，2个字节，单位0.1A
    DIC_SYS_SOC_TYPE,               //电量显示方式，1个字节，百分比电压，0-百分比，1-电压值
    DIC_SYS_UNIT,                   //显示单位,1个字节，公英制，0，是公制，1是英制,公英制
    DIC_SYS_BACKLIGHT,              //背光亮度，1个字节

    DIC_SYS_PAS_NUM,                //档位数量，1个字节
    DIC_SYS_PAS_TAB,                //档位值，11个字节，最大支持11个档，助推挡，0挡+9个挡
    DIC_SYS_PAS_PWM_TAB,            //档位PWM对应表，11个字节，最大支持11个档，助推挡，0挡+9个挡

    DIC_SYS_SPORTS_MODE,            //运动模式，1个字节
    DIC_SYS_LIFT_SPEED_LIMIT,       //解除限速，0，1
//TAG NVS分区--VOLTAGE_INFO--电压信息
    DIC_SYS_VOLTAGE_NUM,            //系统支持的电压数，1个字节
    DIC_SYS_VOLTAGE_TAB,            //系统支持的电压表，5个字节
    DIC_SYS_VOLTAGE_INDEX,          //当前系统电压段，1个字节
    
    DIC_SYS_VOLTAGE_TAB_1,          //系统支持的电压分段1，24个字节，每两个字节一个数据，第一个为欠压值，最后一个为超压值
    DIC_SYS_VOLTAGE_TAB_2,          //系统支持的电压分段2，24个字节
    DIC_SYS_VOLTAGE_TAB_3,          //系统支持的电压分段3，24个字节
    DIC_SYS_VOLTAGE_TAB_4,          //系统支持的电压分段4，24个字节
    DIC_SYS_VOLTAGE_TAB_5,          //系统支持的电压分段5，24个字节
    DIC_SYS_VOLTAGE_PERC_TAB,       //电压百分比对应表，10个字节
    
//TAG NVS分区--PASSWD_INFO--密码信息
    DIC_SYS_PASSWORD_LEN,           //密码长度，1个字节
    DIC_SYS_POWERON_PASSWORD_EN,    //开机密码使能，1个字节
    DIC_SYS_POWERON_PASSWORD,       //开机密码，3个字节，16进制表示，最大支持6位密码
    DIC_SYS_SETTING_PASSWORD_EN,    //设置密码使能，1个字节
    DIC_SYS_SETTING_PASSWORD,       //设置密码，3个字节，16进制表示，最大支持6位密码
    DIC_SYS_USER_PASSWORD_EN,       //设置密码使能，1个字节
    DIC_SYS_USER_PASSWORD,          //设置密码，3个字节，16进制表示，最大支持6位密码
//TAG NVS分区--RIDING_INFO--骑行信息
    DIC_RUN_TRIP_TIME,              //小计骑行时间，4个字节，单位秒
    DIC_RUN_TOTAL_TIME,             //总计骑行时间，4个字节，单位秒
    DIC_RUN_SPEED_MAX,              //最大速度,2个字节，0.1Km/h
    DIC_RUN_SPEED_AVG,              //平均速度,2个字节，0.1Km/h
    DIC_RUN_TRIP,                   //小里程,8个字节，单位：0.1m
    DIC_RUN_ODO,                    //总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_CALORIE,            //卡路里,8个字节，单位：cal
    DIC_RUN_TRIP_CALORIE,            //卡路里,8个字节，单位：cal

//TAG NVS分区--PAS_RIDING_INFO--挡位骑行信息
    DIC_RUN_ODO_PAS1,                   //1挡总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_PAS2,                   //2挡总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_PAS3,                   //3挡总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_PAS4,                   //4挡总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_PAS5,                   //5挡总里程,8个字节，单位：0.1m
    DIC_RUN_ODO_PAS6,                   //6挡总里程,8个字节，单位：0.1m
//TAG NVS分区--CALI_INFO:--校准信息
    DIC_CALI_VOL_REF,                   //电压校准值，4个字节
    DIC_CALI_PHOTO_REF,                 //光感电压校准值，4个字节
    DIC_CALI_HULL_MIN_REF,              //霍尔校准值，4个字节
    DIC_CALI_HULL_MAX_REF,              //霍尔校准值，4个字节
    DIC_CALI_HANDLE_MIN_REF,            //转把校准值，4个字节
    DIC_CALI_HANDLE_MAX_REF,            //转把校准值，4个字节
//TAG NVS分区--BLE_INFO--蓝牙信息
    DIC_BLE_NAME,                       //32个字符
    DIC_TCU_SN,                         //TCU_SN,32个字符




/****************************纯运行参数，不需要保存*****************************/
    DIC_RUN_SYS_STATE,                  //系统状态,0:初始话状态，开机状态，正常运行状态，关机准备状态，关机状态
    DIC_RUN_SOC,                        //电量百分比,1个字节，0-100
    DIC_RUN_SOC_VOL,                    //电压值，4个字节，mV
    DIC_RUN_SPEED,                      //实时速度,2个字节，0.1Km/h
    DIC_RUN_LAMP_STATE,                 //大灯状态,1个字节，0关闭，1打开
    DIC_RUN_BLE_STATE,                  //蓝牙连接状态,1个字节，0断开，1连接
    
    DIC_RUN_ERR_CODE,                   //错误代码，2个字节，
    DIC_RUN_PAS,                        //实时档位，1个字节
    DIC_RUN_PUSH_STATE,                 //实时助推状态，0：无助推，1：有助推
    DIC_RUN_AUTO_POWER_OFF_CNT,         //自动关机计数，2个字节，单位秒
    DIC_RUN_HEAD_LIGHT,                 //前灯状态，1个字节
    
    DIC_RUN_REAR_LIGHT,                 //后灯状态，1个字节               
    DIC_RUN_LEFT_TURN_LIGHT,            //左转向灯状态，1个字节
    DIC_RUN_RIGHT_TURN_LIGHT,           //右转向灯状态，1个字节
    DIC_RUN_HORN,                       //喇叭状态，1个字节
    DIC_RUN_TAIL_LIGHT,                 //尾灯状态，1个字节，
    DIC_RUN_REAR_FOG_LIGHT,             //远光灯状态，1个字节
    
    DIC_RUN_CURRENT,                    //实时电流2个字节，0.01A
    DIC_RUN_POWER,                      //实时功率，2个字节，0.1W
    DIC_RUN_POWER_PERCENT,              //实时功率百分比，1个字节，0-100%
    DIC_RUN_USB_STATE,                  //USB连接状态，0未连接，1已连接
    DIC_RUN_BREAK_STATUS,               //刹车状态,1个字节
    DIC_RUN_VOERHAUL_FLAG,              //检修标志，1个字节overhaul
    DIC_RUN_BACK_LIGHT,                 //背光的亮度等级，1个字节，0.1C
    DIC_RUN_CRUISE_STATE,               //巡航状态，1个字节
    DIC_RUN_SPEED_LIMIT_SW,             //限速开关状态，1个字节,0标识已经限速，1标识不限速

    DIC_CMD_RESET_TO_DEFAULT,           //恢复出厂设置，1个字节
    DIC_CMD_OTA_UPDATE,                 //恢复出厂设置，1个字节
    DIC_CMD_CLEAR_TRIP,                 //清除TRIP，1个字节
    DIC_CMD_PLUS_PAS,                   //增加档位，1个字节
    DIC_CMD_REDUCE_PAS,                 //减少档位，1个字节
    
    DIC_CMD_TIMING,                     //校时，1个字节
    DIC_CMD_CRUISE,                     //巡航指令，1个字节
    DIC_CMD_POWER_OFF,                  //关机，1个字节
    DIC_CMD_LOCK,                       //锁车，1个字节
    DIC_CMD_UNLOCK,                     //开锁，1个字节
    DIC_CMD_BACK_NORMAL_WM,             //返回主界面，1个字节

    DIC_MC_CTL_TEMP,                    //控制器温度，2个字节,0.1C
    DIC_MC_MOTOR_TEMP,                  //控制器电机温度，2个字节
    DIC_MC_REM_TRIP,                    //控制器剩余里程，2个字节
    DIC_MC_TORQUE_EN_CON,               //控制器力矩能量消耗，千卡，2个字节
    DIC_MC_BAT_POWER_OFF,               //电池开关机状态，最高位为有效位，1个字节
    
    DIC_MC_CADENCE,                    //踏频，单位rpm，2个字节
    DIC_MC_TORQUE_VOLT,                //力矩输出电压，单位mv，2个字节
    DIC_MC_MOTOR_SPEED,                //电机转速，单位rpm，1个字节
    DIC_MC_MOTOR_MODE,                 //电机模式0x01-限速模式， 0x2-巡航模式， 0x3-推车模式， 0x4-坡行模式， 0x5-低速续航模式，默认值0Xff，1个字节
    DIC_MC_POWER_OFF_BRAKE,            //断电刹车状态 0x01-刹把闭合，默认值0Xff，1个字节

    DIC_MC_BUS_VOLTAGE,                //母线电压，0.1V，2个字节
    DIC_MC_BUS_CURRENT,                //母线电流，0.1A，2个字节
    DIC_MC_ROTATING_VOLTAGE,           //转把电压，0.1V，1个字节

    DIC_MC_CTL_WORKING_STATUS,         //控制器工作状态，，1个字节
    DIC_MC_CTL_ERROR_CODE,             //控制器错误码，，2个字节

    DIC_MC_EEPROM_VER,                 //EEPROM版本号，6个字节
    DIC_MC_CLEAR_TRIP,                 //清除行程计数，1个字节
    DIC_MC_SOC,                        //电量百分比，1个字节
    //关于检修标志的管理数据结构
    DIC_MAX_NUM,
}KDS_DIC_TABLE_T; // 字典表

extern const uint8_t ec_dic_data_len[DIC_MAX_NUM+1];

//对NVS的操作，与Flash相关
esp_err_t ec_app_param_to_nvs(uint16_t nvs_key,uint8_t dir);//对每个分区进行读取或者写入,NVS<->RAM
void ec_app_save_nvs_param(uint16_t nvs_key);




void ec_app_param_init(void);//初始化参数，初始化参数使用，NVS->RAM
void ec_app_get_nvs_param(void);//从整个nvs区读取所有参数到内存，NVS->RAM

//数据相关
int8_t ec_app_enum_value_rw(uint8_t enum_value,void *data,uint8_t data_len,uint8_t r_or_w);


void ec_app_param_reset(void);
void ec_app_riding_reset_with_ODO(void);
void ec_app_riding_reset_without_ODO(void);
void ec_app_param_save_key_value(uint16_t nvs_key);
//NOTE 通过字典值获取数据的地址，直接进行指针类型的转换，然后取出数据
void *ec_app_param_get_dic_value_addr(uint8_t dic);

//读写数据的接口
uint8_t ec_app_param_get_dic_value_8(uint8_t dic);
uint16_t ec_app_param_get_dic_value_16(uint8_t dic);
uint32_t ec_app_param_get_dic_value_32(uint8_t dic);
uint64_t ec_app_param_get_dic_value_64(uint8_t dic);
void ec_app_param_set_dic_value_8(uint8_t dic,uint8_t data);
void ec_app_param_set_dic_value_16(uint8_t dic,uint16_t data);
void ec_app_param_set_dic_value_32(uint8_t dic,uint32_t data);
void ec_app_param_set_dic_value_64(uint8_t dic,uint64_t data);
int8_t ec_app_param_get_value(uint8_t enum_value,void *data);//从内存获取参数数据 RAM->DATA
int8_t ec_app_param_set_value(uint8_t enum_value,void *data);//将数据保存到内存   DATA->RAM



char *ec_app_param_get_version(void);//获取版本号
uint8_t ec_app_pram_speed_cal_odo(void);//根据速度计算其他的参数

uint16_t ec_param_cal_calories(uint8_t assistLevel, uint16_t workAssistRatio,
                uint16_t motorPower, uint16_t speed, uint16_t torque, uint16_t time);

#endif





